import axios from 'axios'
import type { AxiosInstance, AxiosRequestConfig, InternalAxiosRequestConfig, AxiosResponse, AxiosError } from 'axios'
import { useUserStore } from '../store/user'
import router from '../router'

// 创建axios实例
const service: AxiosInstance = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL || '/api', // 从环境变量获取API基础URL
    timeout: 15000, // 请求超时时间
    headers: {
        'Content-Type': 'application/json;charset=utf-8'
    }
})

// 请求拦截器
service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        const userStore = useUserStore()
        // 如果有token，添加到请求头
        if (userStore.token) {
            config.headers.set('Authorization', `Bearer ${userStore.token}`)
        }
        const lang = localStorage.getItem("language") || 'en';
        if (lang) {
            let langSymbol = "en";
            if (lang === "en") {
                langSymbol = "en";
            } else if (lang === "zh") {
                langSymbol = "zh_cn";
            } else if (lang === "tw") {
                langSymbol = "zh_tw";
            } else if (lang === "jp") {
                langSymbol = "jp";
            } else if (lang === "kr") {
                langSymbol = "kr";
            } else if (lang === "my") {
                langSymbol = "my";
            } else if (lang === "thai") {
                langSymbol = "thai";
            } else if (lang === "esp") {
                langSymbol = "esp";
            } else if (lang === "ind") {
                langSymbol = "ind";
            } else if (lang === "ar") {
                langSymbol = "ar";
            }
            config.headers.lang = langSymbol;
        }
        return config
    },
    (error: AxiosError) => {
        console.error('请求错误:', error)
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    (response: AxiosResponse) => {
        const { data } = response

        // 根据后端接口规范，判断请求是否成功
        // 假设后端返回格式为 { code: number, data: any, message: string }
        if (data.code === 200 || data.code === 0) {
            return data.data
        } else {
            // 处理业务错误
            handleBusinessError(data)
            return Promise.reject(new Error(data.message || '未知错误'))
        }
    },
    (error: AxiosError) => {
        // 处理HTTP错误
        handleHttpError(error)
        return Promise.reject(error)
    }
)

// 处理业务错误
function handleBusinessError(data: any) {
    // 可以根据不同的业务错误码进行不同的处理
    // 例如弹出提示、重定向等
    console.error('业务错误:', data.message)
}

// 处理HTTP错误
function handleHttpError(error: AxiosError) {
    const userStore = useUserStore()

    if (error.response) {
        const status = error.response.status

        // 根据状态码处理不同的错误
        switch (status) {
            case 401: // 未授权
                console.error('未授权，请重新登录')
                // 清除用户信息并跳转到登录页
                userStore.logout()
                router.push('/login')
                break
            case 403: // 禁止访问
                console.error('没有权限访问该资源')
                break
            case 404: // 资源不存在
                console.error('请求的资源不存在')
                break
            case 500: // 服务器错误
                console.error('服务器错误')
                break
            default:
                console.error(`请求错误: ${status}`)
        }
    } else if (error.request) {
        // 请求已发出但没有收到响应
        console.error('网络错误，请检查您的网络连接')
    } else {
        // 请求配置出错
        console.error('请求配置错误:', error.message)
    }
}

// 封装GET请求
export function get<T>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
    return service.get(url, { params, ...config })
}

// 封装POST请求
export function post<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return service.post(url, data, config)
}

// 封装PUT请求
export function put<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return service.put(url, data, config)
}

// 封装DELETE请求
export function del<T>(url: string, params?: any, config?: AxiosRequestConfig): Promise<T> {
    return service.delete(url, { params, ...config })
}

export default service